<?php
	/**
	 * Min klass REGISTER HANDLER som hanterar registrering av användare.
	 */	 
	class RegisterHandler {
		
		private $database = null;
		private $validate = null;

		//----- FUNKTION: CONSTRUCT ----------------------------------------------------------------------------------------
		/**
		* Konstruktor funktion som lägger till en databas i vår privata variabel $database och lägger till en validate i vår privata variabel $validate.
		* @param Database $database Databasen.
		* @param Validate $validate Vår validator.
		*/
		public function __construct(Database $database, Validate $validate)
		{
			$this->database = $database;
			$this->validate = $validate;
		}


		//----- FUNKTION: OCCUPIED USER NAME ----------------------------------------------------------------------------------------
		/**
		* Funktion för att kontrollera om användarnamnet som försöker registreras är upptaget.
		* @param string $username Innehåller det användarnamnet som försöker registreras.
		* @return bool Retunerar true om användarnamnet är upptaget, annars false.
		*/
		public function OccupiedUsername($username)
		{
			$query = "SELECT userName FROM user WHERE userName = ?";
			if ($statement = $this->database->PrepareQuery($query)) {

				$statement->bind_param("s", $username);
				$statement = $this->database->Select($statement);

				$statement->bind_result($database_userName);
				$statement->fetch();
				
				// Om vi har fler än 0 rader så är användarnamnet upptaget.
				if ($statement->num_rows > 0) {
					return true;					

				} else{
					return false;
				}				
			}
			return false;
		}


		//----- FUNKTION: REGISER USER ----------------------------------------------------------------------------------------		
		/**
		* Funktion för att registrera en ny användare.
		* @param string $username Innehåller användarnamnet som ska registreras.
		* @param string $mail Innehåller mailen som ska registreras.
		* @param string $password Innehåller lösenordet som ska registreras.
		* @return int/bool $insertID Den nya infogade radens ID , om detta misslyckas så retuneras false.
		*/
		public function RegisterUser($username, $mail, $password)
		{
			$query = "INSERT INTO user (userName, userMail, userPassword) VALUES(?, ?, ?)";
			if($insertStatement = $this->database->PrepareQuery($query)){
				$insertStatement->bind_param("sss", $username, $mail, $password);
				$insertUserID = $this->database->Insert($insertStatement);				
				return $insertUserID;
			}
			return false;
		}


		//----- FUNKTION: DELETE USER ----------------------------------------------------------------------------------------
		/**
		* Funktion för att ta bort en användare.
		* @param string $userID Det ID:et som ska tas bort.
		* @return bool Anger om det lyckades att ta bort användaren eller inte.
		*/
		public function DeleteUser($userID)
		{
			$userID = intval($userID);
			if(is_numeric($userID) == false){
				return false;	
			}

			$query = "DELETE FROM user WHERE userID = ?";
			if($deleteStatement = $this->database->PrepareQuery($query)){
				$deleteStatement->bind_param("i", $userID);	
				$this->database->Delete($deleteStatement);	
				return true;	
			}
			return false;
		}


		//----- FUNKTION: GET USERS FROM DATABASE ----------------------------------------------------------------------------------------
		/**
		* Funktion för att hämta alla användare som finns i databasen.		
		* @return array $users Retunerar en array med alla användare som finns i databasen.
		*/
		public function GetUsersFromDatabase()
		{
			$query = "SELECT * FROM user";
			if($statement = $this->database->PrepareQuery($query)){
				$statement = $this->database->Select($statement);
				$statement->bind_result($userID, $userName, $userPassword, $userMail);

				$users = array();

				while($statement->fetch()){
					$user = new User();
					$user->userID = strval($userID); // Stringvalue eftersom vi får ut en int från databasen så vill vi göra om den till en string.
					$user->userName = $userName;
					$user->userMail = $userMail;
					$user->userPassword = $userPassword;
					$users[] = $user;
				}
			}
			return $users;		
		}


		//----- FUNKTION: DATA VALIDATOR ----------------------------------------------------------------------------------------
		/**
		* Funktion för att validera all indata som ska skickas till databasen vid registering av en ny användare.
		* @param string $username Innehåller det användarnamnet som ska valideras.
		* @param string $mail Innehåller den mail som ska valideras.
		* @param string $password Innehåller det lösenordet som ska valideras.
		* @param string $repeatPassword Innehåller det repeterade lösenordet som ska valideras.
		* @return array $errorMessagesNumber Innehåller de felmeddelanderna som valideringen har gett upphov till.
		*/
		public function DataValidator($username, $mail, $password, $repeatPassword)
		{
			$errorMessagesNumber = array();

			// Kontrollerar om lösenordet är längre än 6 tecken och inte innehåller några otillåtna tecken.
			if($this->validate->ValidatePassword($password) == false){
				if (strlen($password) < 6) {
					$errorMessagesNumber[] = RegisterView::SHORT_PASSWORD;
				}else {
					$errorMessagesNumber[] = RegisterView::WRONG_PASSWORD;
				}
			}

			// Kontrollerar om användarnamnet är längre än 6 tecken och inte innehåller några otillåtna tecken.
			if($this->validate->ValidateUsername($username) == false){
				if (strlen($username) < 6) {
					$errorMessagesNumber[] = RegisterView::SHORT_USERNAME;
				}else {
					$errorMessagesNumber[] = RegisterView::WRONG_USERNAME;
				}
			}

			// Kontrollerar om mailen är i ett korrekt format. 
			if($this->validate->ValidateMail($mail) == false){
				$errorMessagesNumber[] = RegisterView::WRONG_MAIL;
			}

			// Kontrollerar att det repeterade lösenordet är likadant som det angivna lösenordet.
			if($password != $repeatPassword){
				$errorMessagesNumber[] = RegisterView::WRONG_REPEAT_PASSWORD;
			}
			return $errorMessagesNumber;			
		}



		// ----------------------------------------------------------------------------------------------------------------------
		// - TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST -
		// ----------------------------------------------------------------------------------------------------------------------		
		public function RegTest()
		{
			$username = "jesper";
			$mail = "jesper.hedlund@hotmail.com";
			$password = "hej123";


			$numberOfUsersBeforeRegistration = count($this->GetUsersFromDatabase());
			

			// Test av validering av korrekt data.
			$validateResult = $this->DataValidator($username, $mail, $password, $password);
			if (empty($validateResult) == false) {
				echo "Test av validering av korrekt data misslyckades!";
				return false;
			}

			// Test för att kontrollera om användarnmnet är ledigt. 
			if ($this->OccupiedUsername($username)) {
				echo "Test av OccupiedUsername. Användarnamnet är upptaget, fastän det inte ska vara det.";
				return false;
			}
			
			// Test att registrera en ny användare.
			$userID = $this->RegisterUser($username, $mail, $password);
			$numberOfUsersAfterRegistration = count($this->GetUsersFromDatabase());
			if ($numberOfUsersAfterRegistration == $numberOfUsersBeforeRegistration) {
				echo "Det fungerade INTE att registrering en ny användare!";
				return false;
			}

			// Användarnamn.
			if ($this->OccupiedUsername($username) == false) {
				echo "Det andra testet av OccupiedUsername. Användarnamnet är ledigt, fastän det inte ska vara det.";
				return false;
			}

			// Testar att ta bort en användare.
			if($this->DeleteUser($userID) == false) {
				echo "Det gick inte att tabort en medlem";
				return false;
			}			
			return true;
		}
	}	
?>